// Package _3_非递归后序遍历二叉树 main
// @Title _3_非递归后序遍历二叉树
// @Description
// @Author  == 琳琳也叫王木木 ==  2022-01-14 18:27
// @Create  2022-01-14 18:27
package main

import "fmt"

/**
核心思路： 两个栈

处理栈，+收集栈

1. 处理栈 压入头, 收集栈也压入头
2. 开始循环
3. 处理栈压入右，左
4. 弹出栈，入收集栈


*/

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func main() {
	root := TreeNode{
		1,
		&TreeNode{
			2,
			&TreeNode{
				4,
				nil,
				nil,
			},
			&TreeNode{
				5,
				nil,
				nil,
			},
		},
		&TreeNode{
			3,
			&TreeNode{
				6,
				nil,
				nil,
			},
			&TreeNode{
				7,
				nil,
				nil,
			},
		},
	}
	fmt.Println(noRecRange(&root))
}

//
//  noRecRange
//  @Description: 非递归中序遍历二叉树  左——> 根 -> 右
//  @param root： 二叉树根节点
//  @return []int：先序遍历后的数组
//
func noRecRange(root *TreeNode) []int {
	if root == nil {
		return nil
	}
	// 创建一个收集数组
	var ans []int
	// 创建一个栈
	myStack := []*TreeNode{root}
	for len(myStack) > 0 {
		// 出栈
		temp := myStack[len(myStack)-1]
		myStack = myStack[:len(myStack)-1]
		ans = append(ans, temp.Val)
		// 左子树入栈
		if temp.Left != nil {
			myStack = append(myStack, temp.Left)
		}
		// 右子树入栈
		if temp.Right != nil {
			myStack = append(myStack, temp.Right)
		}
	}
	for i := 0; i < len(ans)/2; i++ {
		ans[i], ans[len(ans)-1-i] = ans[len(ans)-1-i], ans[i]
	}
	return ans
}
